var Monitoring = Monitoring || (function() {

		var stats = new MemoryStats();
		stats.domElement.style.position = 'fixed';
		stats.domElement.style.right        = '0px';
		stats.domElement.style.bottom       = '0px';
		document.body.appendChild( stats.domElement );
		requestAnimationFrame(function rAFloop(){
			stats.update();
			requestAnimationFrame(rAFloop);
		});

		var RenderRate = function () {
			var container = document.createElement( 'div' );
			container.id  = 'stats';
			container.style.cssText = 'width:150px;opacity:0.9;cursor:pointer;position:fixed;right:80px;bottom:0px;';

			var msDiv = document.createElement( 'div' );
			msDiv.id  = 'ms';
			msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#020;';
			container.appendChild( msDiv );

			var msText  = document.createElement( 'div' );
			msText.id = 'msText';
			msText.style.cssText = 'color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px';
			msText.innerHTML= 'Repaint rate: 0/sec';
			msDiv.appendChild( msText );

			var bucketSize = 20;
			var bucket = [];
			var lastTime  = Date.now();
			return {
				domElement: container,
				ping: function () {
					var start = lastTime;
					var stop = Date.now();
					var rate = 1000 / (stop - start);
					bucket.push(rate);
					if (bucket.length > bucketSize) {
						bucket.shift();
					}
					var sum = 0;
					for (var i = 0; i < bucket.length; i++) {
						sum = sum + bucket[i];
					}
					msText.textContent = "Repaint rate: " + (sum / bucket.length).toFixed(2) + "/sec";
					lastTime = stop;
				}
			}
		};

		var renderRate = new RenderRate();
		document.body.appendChild( renderRate.domElement );

		return {
			memoryStats: stats,
			renderRate: renderRate
		};

	})();